
'''
该代码用于解决一个问题，即计算一个数组中的圆形区间是否相交，并统计这些相交的次数。

问题描述：
给定一个非负整数数组A，其中A[i]表示一个以i为中心、半径为A[i]的圆形区间。请计算这些圆形区间的相交次数。

示例数据：
假设数组A = [1, 5, 2, 1, 4, 0]，该数组表示6个圆形区间，它们的端点为：

以0为中心、半径为1的圆形区间，端点为[-1, 1]
以1为中心、半径为5的圆形区间，端点为[-4, 6]
以2为中心、半径为2的圆形区间，端点为[0, 4]
以3为中心、半径为1的圆形区间，端点为[2, 4]
以4为中心、半径为4的圆形区间，端点为[0, 8]
以5为中心、半径为0的圆形区间，端点为[5, 5]
这些圆形区间的相交次数为11。所以，当A = [1, 5, 2, 1, 4, 0]时，代码返回值为11。
'''

def solution(A):
    e = [] # endpoints
    for i, a in enumerate(A):
        e += [(i-a, 1), (i+a, 0)]
    e.sort(key=lambda x: (x[0], not x[1]))
    c=0 # count of intersections
    ac=0 # active circles
 
    for _, start in e:
        if start:
            c+=ac
            ac+= 1
        else:
            ac-= 1
        if c > 10000000:
            return -1 
    return c

A = [1, 5, 2, 1, 4, 0]
print(solution(A))



'''

当然可以。让我们使用数据 A = [1, 5, 2, 1, 4, 0] 详细地逐步演示这段代码的运行过程。

首先，初始化空列表 e = []。

对于数组 A 中的每一个元素，我们计算并添加圆的开始和结束端点到列表 e。

遍历结果如下：

当 i=0, A[i]=1，端点是：[-1, 1]。所以，e 添加 [-1, 1] 和 [1, 0]。
当 i=1, A[i]=5，端点是：[-4, 6]。所以，e 添加 [-4, 1] 和 [6, 0]。
当 i=2, A[i]=2，端点是：[0, 4]。所以，e 添加 [0, 1] 和 [4, 0]。
当 i=3, A[i]=1，端点是：[2, 4]。所以，e 添加 [2, 1] 和 [4, 0]。
当 i=4, A[i]=4，端点是：[0, 8]。所以，e 添加 [0, 1] 和 [8, 0]。
当 i=5, A[i]=0，端点是：[5, 5]。所以，e 添加 [5, 1] 和 [5, 0]。
此时，e 的内容为：[-1, 1], [1, 0], [-4, 1], [6, 0], [0, 1], [4, 0], [2, 1], [4, 0], [0, 1], [8, 0], [5, 1], [5, 0]。

接下来，我们按照端点值和其标志对 e 进行排序。排序后的 e 是：[-4, 1], [-1, 1], [0, 1], [0, 1], [1, 0], [2, 1], [4, 0], [4, 0], [5, 1], [5, 0], [6, 0], [8, 0]。

初始化 c=0 和 ac=0。

遍历排序后的列表 e，计算相交的次数。

在这个遍历过程中，每当我们遇到一个开始端点（标志为1），我们增加 c 的值，此时的增加量为当前活跃的圆的数量 ac。同时，活跃的圆的数量 ac 增加1。每当我们遇到一个结束端点（标志为0），活跃的圆的数量 ac 减少1。

遍历 e 的结果如下：

[-4, 1]：c=0, ac=1
[-1, 1]：c=1, ac=2
[0, 1]：c=3, ac=3
[0, 1]：c=6, ac=4
[1, 0]：c=6, ac=3
[2, 1]：c=9, ac=4
[4, 0]：c=9, ac=3
[4, 0]：c=9, ac=2
[5, 1]：c=11, ac=3
[5, 0]：c=11, ac=2
[6, 0]：c=11, ac=1
[8, 0]：c=11, ac=0
此时，相交的次数 c 为11。

最终，代码返回 c 的值，即11。
这就是使用数据 A = [1, 5, 2, 1, 4, 0] 运行该代码的详细过程。


'''